package net.interneteidee.entity;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlList;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.validator.constraints.Range;

@Entity
@XmlRootElement
public class Fattura {

	@Id
	@GeneratedValue
	private long idFattura;

	@Column(unique = true)
    @Range(min=1 , max=2000 ,message="Codice Fattura non corretto")
	private long codiceFattura;

	@Temporal(TemporalType.DATE)
	@NotNull(message="Data Emissione non selezionata")
	private Date dataEmissione;
	
	@Temporal(TemporalType.DATE)
	@NotNull(message="Data Scadenza non selezionata")
	private Date dataScadenza;

	private double importoTotale;

	private String note;

	private String pagamento;

	private String stato;

	@ManyToOne
	@JoinColumn(name = "cliente_fk" )
	private Cliente cliente = new Cliente() ;

	@ManyToMany(mappedBy = "fatture")
	private List<Ordine> ordini;

	@OneToMany(fetch = FetchType.EAGER ,cascade = {CascadeType.PERSIST , CascadeType.MERGE})
	@JoinColumn(name = "fattura_fk")
	private List<LineaFattura> lineeFattura = new LinkedList<LineaFattura>();

	public Fattura() {
		// TODO Auto-generated constructor stub
	}

	
	public Fattura( long codiceFattura, Date dataEmissione,
			int importoTotale, String note, String pagamento, String stato) {
		super();
		this.codiceFattura = codiceFattura;
		this.dataEmissione = dataEmissione;
		this.importoTotale = importoTotale;
		this.note = note;
		this.pagamento = pagamento;
		this.stato = stato;
	}

	public long getIdFattura() {
		return idFattura;
	}

	public void setIdFattura(long idFattura) {
		this.idFattura = idFattura;
	}

	public long getCodiceFattura() {
		return codiceFattura;
	}

	public void setCodiceFattura(long codiceFattura) {
		this.codiceFattura = codiceFattura;
	}

	public Date getDataEmissione() {
		return dataEmissione;
	}

	public void setDataEmissione(Date dataEmissione) {
		this.dataEmissione = dataEmissione;
	}

	public double getImportoTotale() {
		return importoTotale;
	}


	public void setImportoTotale(double importoTotale) {
		this.importoTotale = importoTotale;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}

	public String getPagamento() {
		return pagamento;
	}

	public void setPagamento(String pagamento) {
		this.pagamento = pagamento;
	}

	public String getStato() {
		return stato;
	}

	public void setStato(String stato) {
		this.stato = stato;
	}

	@XmlTransient
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@XmlTransient
	public List<Ordine> getOrdini() {
		return ordini;
	}

	public void setOrdini(List<Ordine> ordini) {
		this.ordini = ordini;
	}

	@XmlTransient
	public List<LineaFattura> getLineeFattura() {
		return lineeFattura;
	}

	public void setLineeFattura(List<LineaFattura> lineeFattura) {
		this.lineeFattura = lineeFattura;
	}

	/**
	 * Aggiunge un ordine alla fattura corrente
	 * 
	 * @param ordine
	 */
	public void addOrdine(Ordine ordine) {
		ordini.add(ordine);
	}

	/**
	 * Aggiunge una linea alla fattura corrente
	 * 
	 * @param lineaFattura
	 */
	public void addLineaFattura(LineaFattura lineaFattura) {
		lineeFattura.add(lineaFattura);
	}

	public Date getDataScadenza() {
		return dataScadenza;
	}

	public void setDataScadenza(Date dataScadenza) {
		this.dataScadenza = dataScadenza;
	}


	@Override
	public String toString() {
		return "Fattura [idFattura=" + idFattura + "]";
	}
	
	

}
